//最开始打算能够统计汉字的，但由于汉字不能使用char，所以暂且放弃了，思路的话，有两种，一种是直接创建真正的二叉树，但因为这种思路过于简单无趣，暂且搁置，最终决定使用法二：使用vector模拟二叉树
#include<iostream>
#include<unordered_map>
#include<string>
#include<vector>
#include<unordered_set>
using namespace std;
namespace dzh
{
	//小堆的比较用仿函数（小堆用大于）
	struct Compare
	{
		bool operator()(pair<char, int> a, pair<char, int> b);
	};
	struct HuffmanNode
	{
		HuffmanNode(int weight, char data, int left = -1, int right = -1, int parent = -1);
		int _weight = -1;
		int _left = -1;
		int _right = -1;
		int _parent = -1;
		char _data = ' ';
	};
	ostream& operator<<(ostream& os, const HuffmanNode& t);
//	//编码表用类：vector存储时需要，本程序打算直接使用哈希进行编码表的存储
//	struct CodeTable
//	{
//		CodeTable()
//		{
//		}
//		char _ch = ' ';
//		string code;
//	};
	class HuffmanTree
	{
	public:
		HuffmanTree(string filename);
		void EnCode(string codeFileName);
		void DeCode(string codeFileName, string deCodeFileName);
		void PrintTree();
		void PrintTable();
		size_t UniqueCharCount();
		size_t SourceCharCount();
	private:
		vector<HuffmanNode> _root;
		unordered_map<char, string> _table;
		unordered_map<string, char> _retable;
		size_t _uniqueCharCount = 0;
		size_t _sourceCharCount = 0;
		string _filename = "";
		unordered_set<string> _codeFileName;
	};

	void test1();
	void test2();
}
